package com.ayf.payment.game.api.service.platform.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ayf.payment.game.api.dto.platform.SubstitutePayConfigDTO;
import com.ayf.payment.game.api.dto.platform.criteria.SubstitutePayCriteria;
import com.ayf.payment.game.api.dto.platform.pay.EhbPayConfigParamVO;
import com.ayf.payment.game.api.dto.platform.pay.WanXiangPayConfigParamVO;
import com.ayf.payment.game.api.entity.platform.SubstitutePayConfig;
import com.ayf.payment.game.api.exception.ParameterException;
import com.ayf.payment.game.api.mapper.platform.SubstitutePayConfigMapper;
import com.ayf.payment.game.api.service.platform.SubstitutePayConfigService;
import com.ayf.payment.game.api.type.PayChannelCodeEnum;
import com.ayf.payment.game.api.utils.RSAKeyGenerateUtil;
import com.swwx.charm.commons.lang.utils.BeanConvertUtils;
import com.swwx.charm.commons.lang.utils.LogPortal;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class SubstitutePayConfigServiceImpl implements SubstitutePayConfigService {

    @Resource
    private SubstitutePayConfigMapper substitutePayConfigMapper;

    @Override
    public SubstitutePayConfigDTO getSubstitutePayConfigByChannelCode(Integer payType) {
        SubstitutePayConfig config = substitutePayConfigMapper.getSubstitutePayConfigByChannelCode(payType);
        return getSubstitutePayConfigDTO(config);
    }

    private SubstitutePayConfigDTO getSubstitutePayConfigDTO(SubstitutePayConfig config) {
        SubstitutePayConfigDTO substitutePayConfigDTO = BeanConvertUtils.convert(config, SubstitutePayConfigDTO.class);
        if (substitutePayConfigDTO != null && StringUtils.isNotEmpty(substitutePayConfigDTO.getPayConfig())) {
            if (PayChannelCodeEnum.EHB_PAY.getCode().equals(substitutePayConfigDTO.getChannelCode())) {
                EhbPayConfigParamVO ehbPayConfigParamVO = JSON.parseObject(substitutePayConfigDTO.getPayConfig(), EhbPayConfigParamVO.class);
                substitutePayConfigDTO.setEhbPayConfigParamVO(ehbPayConfigParamVO);
            } else {
                WanXiangPayConfigParamVO vo = JSON.parseObject(substitutePayConfigDTO.getPayConfig(),
                        WanXiangPayConfigParamVO.class);
                substitutePayConfigDTO.setWanXiangPayConfigParamVO(vo);
            }
            substitutePayConfigDTO.setPayConfig("");
        }
        return substitutePayConfigDTO;
    }

    @Override
    public List<SubstitutePayConfigDTO> getListSubstitutePayConfigByChannelCode(SubstitutePayCriteria substitutePayCriteria) {
        List<SubstitutePayConfig> dbList = substitutePayConfigMapper.getListSubstitutePayConfigByChannelCode(substitutePayCriteria);
        List<SubstitutePayConfigDTO> dtoList = new ArrayList<>();
        for (SubstitutePayConfig config : dbList) {
            SubstitutePayConfigDTO configDTO = getSubstitutePayConfigDTO(config);
            dtoList.add(configDTO);
        }
        return dtoList;
    }

    @Override
    public boolean update(SubstitutePayConfigDTO substitutePayConfigDTO) {
        SubstitutePayConfig config = new SubstitutePayConfig();
        config.setId(substitutePayConfigDTO.getId());
        config.setLevel(substitutePayConfigDTO.getLevel());
        config.setStatus(substitutePayConfigDTO.getStatus());
        return substitutePayConfigMapper.updateByPrimaryKeySelective(config) > 0;
    }

    @Override
    public void updateSubstitutePayConfig(SubstitutePayConfigDTO substitutePayConfigDTO) {
        SubstitutePayConfig substitutePayConfig = new SubstitutePayConfig();
        substitutePayConfig.setId(substitutePayConfigDTO.getId());
        if (PayChannelCodeEnum.EHB_PAY.getCode().equals(substitutePayConfigDTO.getChannelCode())) {
            substitutePayConfig.setPayConfig(JSON.toJSONString(substitutePayConfigDTO.getEhbPayConfigParamVO()));
        } else {
            substitutePayConfig.setPayConfig(JSON.toJSONString(substitutePayConfigDTO.getWanXiangPayConfigParamVO()));
        }
        substitutePayConfigMapper.updateByPrimaryKeySelective(substitutePayConfig);
    }

    @Override
    public SubstitutePayConfigDTO updateSubstitutePayConfigMerchantPubPriKey(SubstitutePayConfigDTO substitutePayConfigDTO) throws ParameterException {
        SubstitutePayConfig substitutePayConfig = substitutePayConfigMapper.selectByPrimaryKey(substitutePayConfigDTO.getId());
        if (substitutePayConfig == null){
            LogPortal.error("修改商户公私钥 主键ID:{} 记录不存在",substitutePayConfigDTO.getId());
            throw new ParameterException("代付支付通道不存在，请联系技术支持");
        }
        JSONObject payConfigJson = JSON.parseObject(substitutePayConfig.getPayConfig());
        RSAKeyGenerateUtil.RSAKey rsaKey = RSAKeyGenerateUtil.genKey();
        payConfigJson.put("merchantPubKey",rsaKey.getPubKey());
        payConfigJson.put("merchantPriKey",rsaKey.getPrikey());
        substitutePayConfig.setPayConfig(payConfigJson.toJSONString());
        substitutePayConfigMapper.updateByPrimaryKeySelective(substitutePayConfig);

        SubstitutePayConfigDTO substitutePayConfigDTO1 = BeanConvertUtils.convert(substitutePayConfig, SubstitutePayConfigDTO.class);
        if (substitutePayConfigDTO1 != null && StringUtils.isNotEmpty(substitutePayConfigDTO1.getPayConfig())){
            EhbPayConfigParamVO ehbPayConfigParamVO = JSON.parseObject(substitutePayConfigDTO1.getPayConfig(), EhbPayConfigParamVO.class);
            ehbPayConfigParamVO.setMerchantPriKey("");
            substitutePayConfigDTO1.setEhbPayConfigParamVO(ehbPayConfigParamVO);
        }
        substitutePayConfigDTO1.setPayConfig("");
        return substitutePayConfigDTO1;
    }

    @Override
    public SubstitutePayConfigDTO getSubstitutePayConfigById(Integer substitutePayConfigId) {
        SubstitutePayConfig config = substitutePayConfigMapper.selectByPrimaryKey(substitutePayConfigId);
        return getSubstitutePayConfigDTO(config);
    }
}

